﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using IM.gerenciadores;
using System.Threading;

namespace IM
{
    public partial class FormPrivado : Form, InterfaceRemota.IPrivado
    {
        delegate void SetTextCallback(InterfaceRemota.IMensagem mensagem);
        delegate void ExibeForm();

        private FormPrincipal formPai;

        private InterfaceRemota.IUsuario destino;

        private InterfaceRemota.IServidor servidor;


        public FormPrivado(
            FormPrincipal formPai,
            InterfaceRemota.IUsuario destino,
            InterfaceRemota.IServidor servidor)
        {
            InitializeComponent();
            this.formPai = formPai;
            this.destino = destino;
            this.servidor = servidor;
            Control.CheckForIllegalCrossThreadCalls = false;
        }

        private void FormPrivado_Load(object sender, EventArgs e)
        {
            configuraAvatarENome(avatarOrigem, txtOrigem, this.formPai.Login, this.formPai.Nome);
            configuraAvatarENome(avatarDestino, txtDestino, this.destino.Login, this.destino.Nome);
        }

        private void configuraAvatarENome(PictureBox avatar, TextBox txtNome,
            String login, String nome)
        {
            GerenciadorDeUsuarios gUser = GerenciadorDeUsuarios.getInstancia();
            byte[] avatarServer = this.servidor.getAvatarPorLogin(login);
            avatar.Image = gUser.getByteArrayAsImage(avatarServer);
            txtNome.Text = nome;
        }

        private void FormPrivado_FormClosed(object sender, FormClosedEventArgs e)
        {
            this.formPai.UsuariosNoPrivado.Remove(this.destino);
        }

        public void titulo(String titulo)
        {
            this.Text = titulo;
        }


        private void btnEnviar_Click(object sender, EventArgs e)
        {
            GerenciadorDeTexto gText = GerenciadorDeTexto.getInstancia();
            GerenciadorDeUsuarios gUser = GerenciadorDeUsuarios.getInstancia();
            String strMensagem = txtMensagem.Text;
            if ((strMensagem != null) && (strMensagem.Trim().Length > 0))
            {
                InterfaceRemota.IMensagem mensagem = new Gerenciamento.MensagemImpl();
                gText.configuraCorMensagem(mensagem, txtMensagem.ForeColor);
                gText.configuraFonteMensagem(mensagem, txtMensagem.Font);

                String mensagemPronta = this.formPai.Nome + " diz";

                mensagemPronta += " (" + DateTime.Now.ToShortTimeString() + "): ";

                String msgmEnviada = Gerenciamento.Codificador.codificaString(mensagemPronta + strMensagem);
                mensagem.Mensagem = msgmEnviada;
                txtMensagem.Text = "";
                this.formPai.enviaMensagemPrivada(this.destino, mensagem);
                //this.principal.enviaMensagemPrivada(this.destino, mensagem);
                //this.preencheConversa(mensagem);
            }
            else
            {
                MessageBox.Show("Pra que um comunicador se você não digita mensagem???");
            }
        }

        private InterfaceRemota.IMensagem msg;
        public void recebeMensagem(InterfaceRemota.IMensagem mensagem)
        {
            this.msg = mensagem;
            Thread thread = new Thread(threadConversa);
            thread.Start();
        }

        private void threadConversa()
        {
            Thread.Sleep(10);
            if (txtConversa.InvokeRequired)
            {
                SetTextCallback cb = new SetTextCallback(preencheConversa);
                txtConversa.Invoke(cb, msg);
            }
            else
            {
                preencheConversa(msg);
            }
        }

        private void preencheConversa(InterfaceRemota.IMensagem mensagem)
        {
            GerenciadorDeTexto gText = GerenciadorDeTexto.getInstancia();
            String msgmDecodificada = Gerenciamento.Codificador.decodificaString(mensagem.Mensagem);
            Color cor = Color.FromArgb(mensagem.A, mensagem.R, mensagem.G, mensagem.B);
            txtConversa.SelectionColor = cor;
            FontStyle estilo = gText.configuraEstilo(mensagem.EstiloFonte);
            txtConversa.SelectionFont = new Font(mensagem.NomeFonte, mensagem.TamanhoFonte, estilo);
            if (txtConversa.Text.Length == 0)
            {
                txtConversa.SelectedText += msgmDecodificada;
            }
            else
            {
                txtConversa.SelectedText += Environment.NewLine + msgmDecodificada;
            }
            txtConversa.Select(txtConversa.Text.Length, 0);
            txtConversa.ScrollToCaret();
        }

        public void showForm()
        {
            Show();
        }


        public void mostra()
        {
            Thread threadExibe = new Thread(threadExibeForm);
            threadExibe.Start();
        }

        private void threadExibeForm()
        {
            Thread.Sleep(10);

            if (this.InvokeRequired)
            {
                ExibeForm exibe = new ExibeForm(showForm);
                this.Invoke(exibe);
            }
            else
            {
                showForm();
            }
        }
    }
}
